package src.BlueBridge.DeepRecursion;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * 给定整数序列a1, a2, ..., an，判断是否可以从中选出若干数，使他们的和恰好为k
 * 样例:
 * 输入
 *     n = 4
 *     a = {1, 2, 4, 7}
 *     k = 13
 * 输出
 *     Yes (13 = 2 + 4 + 7)
 * 法一:自己实现
 *           二进制迭代法 每一位上要或者不要
 * 法二:递归DFS
 *           a = {1, 2, 4, 7}
 *           k = 13
 *           可以选1，也可以不选1，倘若选了1作为加法因子的话，也就只剩下13-1=12了
 *           那就把12交给后面的数字去处理，能处理出来则就是解，凑不出来就舍弃1
 */

public class _9部分和 {
    static int kk;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n];
        for (int i = 0 ; i < n ; i++) {
            a[i] = sc.nextInt();
        }
        int k = sc.nextInt(); // 13
        kk = k;
        dfs(a, k, 0, new ArrayList<Integer>());
    }

    public static void dfs(int[] a, int k, int cur, ArrayList<Integer> ints) {
        if (k == 0) {
            System.out.print("Yes (" + kk + " = ");
            int size = ints.size();
            for (int i = 0 ; i < size ; i++) {
                System.out.print(ints.get(i) + (i == size - 1? "":" + "));
            }
            System.out.println(")");
            System.exit(0);
        }
        // 这条路线走不通
        if (k < 0 || cur == a.length)
            return;
        // 不要这个元素
        dfs(a, k, cur + 1, ints);
        // 要这个元素
        ints.add(a[cur]);
        int index = ints.size() - 1;
        dfs(a, k - a[cur], cur + 1, ints);
        // 回退到平行状态的时候一定要把刚刚添加的元素去掉
        // 思想:dfs的时候一定要想清楚里面有没有共享的集合或者数组，它是变化的
        // 如果有，在退回的时候，一定要恢复，回溯
        ints.remove(index);
    }

    // 二进制迭代子集写法，自己实现
}
